home *** CD-ROM | disk | FTP | other *** search
- #define ILLEGAL 257
- #define NUM 258
- #define MINUS 259
- #ifndef YYSTYPE
- #define YYSTYPE int
- #endif
- YYSTYPE yylval, yyval;
- #define YYERRCODE 256
-
- # line 60 "Dec.y"
-
-
- /****************************************************************/
-
- #include "stdio.h"
- #include "ctype.h"
- #include "string.h"
-
- /****************************************************************/
-
- char *input;
- char *token;
-
- /****************************************************************/
-
- #define yyerror(x) {errordisplay(tmpstate, pcyytoken); return(0);}
-
- yyparse();
- int yylex();
- void errordisplay(int state, int tokentype);
-
- /****************************************************************/
-
- void main(int argc, char *argv[])
- {
-
- char thestring[256];
-
- if (argc < 1)
- printf("\tMajor serious real bad impossible error!\n");
- else if (argc > 2)
- printf("\tHey! One at a time!\n");
- else if (argc == 2)
- {
- input = argv[1];
- yyparse();
- }
- else
- {
- printf("? ");
- while (strlen(gets(thestring)) > 2)
- {
- input = &thestring[2];
- yyparse();
- printf("? ");
- }
- }
-
- }
-
- /****************************************************************/
-
- int yylex()
- {
-
- token = strtok(input, " ");
- input = 0;
-
- if (token == 0)
- return('\n');
- else if (sscanf(token, "%x", &yylval) == 1)
- return(NUM);
- else switch(token[0])
- {
- case '\n':
- case '(':
- case ')':
- case '+':
- case '-':
- return(token[0]);
- default:
- return(ILLEGAL);
- }
-
- }
-
- /****************************************************************/
-
- void errordisplay(int state, int tokentype)
- {
-
- if (tokentype == ILLEGAL)
- printf("\tIllegal character!\n");
- else switch (state)
- {
-
- case 0:
- case 3:
- case 4:
- case 7:
- case 8:
- case 9:
- case 10:
- printf("\tExpecting a number, ‘-’ or ‘(’!\n");
- break;
-
- case 2:
- printf("\tExpecting an operator or end of input!\n");
- break;
-
- case 12:
- printf("\tExpecting an operator or ‘)’!\n");
- break;
-
- case 13:
- case 14:
- printf("\tExpecting a ‘*’ or ‘/’!\n");
- break;
-
- default:
- printf("\tImpossible error! State = %d, token = %d\n",
- state, tokentype);
- break;
-
- }
-
- }
-
- /****************************************************************/
-
-
- #include <stdio.h>
- FILE *yytfilep;
- char *yytfilen;
- int yytflag = 0;
- int svdprd[2];
- char svdnams[2][2];
-
- int *yyxi;
- int yyexca[] = {
- -1, 1,
- 0, -1,
- -2, 0,
- 0,
- };
-
- #define YYNPROD 9
- #define YYLAST 219
-
- int yyact[] = {
- 4, 6, 17, 9, 7, 3, 8, 9,
- 10, 2, 1, 0, 10, 11, 12, 0,
- 0, 13, 14, 15, 16, 4, 7, 8,
- 9, 10, 2, 0, 0, 0, 9, 7,
- 0, 8, 0, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 5,
- };
-
- int yypact[] = {
- -40, -1000, -12, -40, -40, -1000, -1000, -40,
- -40, -40, -40, -1000, -39, -35, -35, -1000,
- -1000, -1000,
- };
-
- int yypgo[] = {
- 0, 10, 9,
- };
-
- int yyr1[] = {
- 0, 1, 2, 2, 2, 2, 2, 2,
- 2,
- };
-
- int yyr2[] = {
- 2, 2, 3, 3, 3, 3, 2, 3,
- 1,
- };
-
- int yychk[] = {
- -1000, -1, -2, 45, 40, 258, 13, 43,
- 45, 42, 47, -2, -2, -2, -2, -2,
- -2, 41,
- };
-
- int yydef[] = {
- 0, -2, 0, 0, 0, 8, 1, 0,
- 0, 0, 0, 6, 0, 2, 3, 4,
- 5, 7,
- };
-
- /*****************************************************************/
- /* PCYACC LALR parser driver routine -- a table driven procedure */
- /* for recognizing sentences of a language defined by the */
- /* grammar that PCYACC analyzes. An LALR parsing table is then */
- /* constructed for the grammar and the skeletal parser uses the */
- /* table when performing syntactical analysis on input source */
- /* programs. The actions associated with grammar rules are */
- /* inserted into a switch statement for execution. */
- /*****************************************************************/
-
-
- #ifndef YYMAXDEPTH
- #define YYMAXDEPTH 200
- #endif
- #ifndef YYREDMAX
- #define YYREDMAX 1000
- #endif
- #define PCYYFLAG -1000
- #define WAS0ERR 0
- #define WAS1ERR 1
- #define WAS2ERR 2
- #define WAS3ERR 3
- #define yyclearin pcyytoken = -1
- #define yyerrok pcyyerrfl = 0
- YYSTYPE yyv[YYMAXDEPTH]; /* value stack */
- int pcyyerrct = 0; /* error count */
- int pcyyerrfl = 0; /* error flag */
- int redseq[YYREDMAX];
- int redcnt = 0;
- int pcyytoken = -1; /* input token */
-
-
- yyparse()
- {
- int statestack[YYMAXDEPTH]; /* state stack */
- int j, m; /* working index */
- YYSTYPE *yypvt;
- int tmpstate, tmptoken, *yyps, n;
- YYSTYPE *yypv;
-
-
- tmpstate = 0;
- pcyytoken = -1;
- #ifdef YYDEBUG
- tmptoken = -1;
- #endif
- pcyyerrct = 0;
- pcyyerrfl = 0;
- yyps = &statestack[-1];
- yypv = &yyv[-1];
-
-
- enstack: /* push stack */
- #ifdef YYDEBUG
- printf("at state %d, next token %d\n", tmpstate, tmptoken);
- #endif
- if (++yyps - &statestack[YYMAXDEPTH] > 0) {
- yyerror("pcyacc internal stack overflow");
- return(1);
- }
- *yyps = tmpstate;
- ++yypv;
- *yypv = yyval;
-
-
- newstate:
- n = yypact[tmpstate];
- if (n <= PCYYFLAG) goto defaultact; /* a simple state */
-
-
- if (pcyytoken < 0) if ((pcyytoken=yylex()) < 0) pcyytoken = 0;
- if ((n += pcyytoken) < 0 || n >= YYLAST) goto defaultact;
-
-
- if (yychk[n=yyact[n]] == pcyytoken) { /* a shift */
- #ifdef YYDEBUG
- tmptoken = pcyytoken;
- #endif
- pcyytoken = -1;
- yyval = yylval;
- tmpstate = n;
- if (pcyyerrfl > 0) --pcyyerrfl;
- goto enstack;
- }
-
-
- defaultact:
-
-
- if ((n=yydef[tmpstate]) == -2) {
- if (pcyytoken < 0) if ((pcyytoken=yylex())<0) pcyytoken = 0;
- for (yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=tmpstate); yyxi += 2);
- while (*(yyxi+=2) >= 0) if (*yyxi == pcyytoken) break;
- if ((n=yyxi[1]) < 0) { /* an accept action */
- if (yytflag) {
- int ti; int tj;
- yytfilep = fopen(yytfilen, "w");
- if (yytfilep == NULL) {
- fprintf(stderr, "Can't open t file: %s\n", yytfilen);
- return(0); }
- for (ti=redcnt-1; ti>=0; ti--) {
- tj = svdprd[redseq[ti]];
- while (strcmp(svdnams[tj], "$EOP"))
- fprintf(yytfilep, "%s ", svdnams[tj++]);
- fprintf(yytfilep, "\n");
- }
- fclose(yytfilep);
- }
- return (0);
- }
- }
-
-
- if (n == 0) { /* error situation */
- switch (pcyyerrfl) {
- case WAS0ERR: /* an error just occurred */
- yyerror("syntax error");
- yyerrlab:
- ++pcyyerrct;
- case WAS1ERR:
- case WAS2ERR: /* try again */
- pcyyerrfl = 3;
- /* find a state for a legal shift action */
- while (yyps >= statestack) {
- n = yypact[*yyps] + YYERRCODE;
- if (n >= 0 && n < YYLAST && yychk[yyact[n]] == YYERRCODE) {
- tmpstate = yyact[n]; /* simulate a shift of "error" */
- goto enstack;
- }
- n = yypact[*yyps];
-
-
- /* the current yyps has no shift on "error", pop stack */
- #ifdef YYDEBUG
- printf("error: pop state %d, recover state %d\n", *yyps, yyps[-1]);
- #endif
- --yyps;
- --yypv;
- }
-
-
- yyabort:
- return(1);
-
-
- case WAS3ERR: /* clobber input char */
- #ifdef YYDEBUG
- printf("error: discard token %d\n", pcyytoken);
- #endif
- if (pcyytoken == 0) goto yyabort; /* quit */
- pcyytoken = -1;
- goto newstate; } /* switch */
- } /* if */
-
-
- /* reduction, given a production n */
- #ifdef YYDEBUG
- printf("reduce with rule %d\n", n);
- #endif
- if (yytflag && redcnt<YYREDMAX) redseq[redcnt++] = n;
- yyps -= yyr2[n];
- yypvt = yypv;
- yypv -= yyr2[n];
- yyval = yypv[1];
- m = n;
- /* find next state from goto table */
- n = yyr1[n];
- j = yypgo[n] + *yyps + 1;
- if (j>=YYLAST || yychk[ tmpstate = yyact[j] ] != -n) tmpstate = yyact[yypgo[n]];
- switch (m) { /* actions associated with grammar rules */
-
- case 1:
- # line 10 "Dec.y"
- {
- printf("\t= %d\n", yypvt[-1]);
- return(0);
- } break;
- case 2:
- # line 18 "Dec.y"
- {
- yyval = yypvt[-2] + yypvt[-0];
- } break;
- case 3:
- # line 23 "Dec.y"
- {
- yyval = yypvt[-2] - yypvt[-0];
- } break;
- case 4:
- # line 28 "Dec.y"
- {
- yyval = yypvt[-2] * yypvt[-0];
- } break;
- case 5:
- # line 33 "Dec.y"
- {
- if (yypvt[-0] != 0)
- yyval = yypvt[-2] / yypvt[-0];
- else
- {
- printf("Attempt to divide by zero!\n");
- return(0);
- }
- } break;
- case 6:
- # line 44 "Dec.y"
- {
- yyval = - yypvt[-0];
- } break;
- case 7:
- # line 49 "Dec.y"
- {
- yyval = yypvt[-1];
- } break;
- case 8:
- # line 54 "Dec.y"
- {
- yyval = yypvt[-0];
- } break; }
- goto enstack;
- }
-